可視化サービスのデータソースにTimestreamを選択する場合に留意しておくべきこと
はじめに
可視化サービスのデータソースにTimestreamを選択する場合に留意しておくべき点について紹介します。
以降のTimestreamという表現はTimestream for LiveAnalyticsを指します。
今回は私がAmazon Managed Grafana(以下AMG)のデータソースにTimestreamを使用した際、仕様を理解していなかったばかりに数十ドルの課金が発生したお話をしたいと思います。
皆さんも自身のユースケースにあった利用方法ができているか、この機会に確認してみて下さい。
Timestreamのアップデート
今回、私が意識できていなかったのはTimestreamのアップデートについてです。 先日Amazon Timestream for LiveAnalyticsの課金体系にアップデートがありました。
このアップデートは、簡単に説明すると 今まではスキャンしたデータのサイズに対してコストが発生していた。 アップデート後はクエリに使用したコンピューティングリソース(TCU)に対してコストが発生するよ。というアップデートです。 イメージとしてはこんな感じです。
アップデート前から存在するアカウントでは、以前のスキャンサイズに対する課金モードのままです。 アップデートの内容を適用するにはTimestreamのコンソール画面で「Admin dashboard」>「Configure admin settings」で設定を行います。 ただし、アップデートの内容を適用した場合、以前のスキャンデータサイズに対する課金モードには戻せないため注意が必要です。(執筆時点)
アップデートの紹介と実際にクエリを実行した場合の消費TCUなどについてはこちらの記事が参考になります。
具体的にどんな影響があるの?
コストが発生する部分が変わった。ということは分かりました。 では具体的に私たちが使う上でどのような影響があるのでしょうか。
1点目は消費するTCUの上限が設定できるようになった点です。 今回のアップデートにより、クエリに使用するコンピューティングリソース(TCU)の上限を設定できるようになりました。 これにより、想定外のスキャンサイズで大きなコストがかかってしまった!ということを防げます。
2点目は、消費されるTCUの最低単位が設定されている点です。 スキャンデータサイズに限らず、最低でも4TCUが30秒間消費されます。
今回は、この2点目を意識できていなかったことで想定外のコストが発生してしまっていたというお話です。
コストが発生したユースケース
ではどのようなケースで想定外のコストが発生したのか見てみましょう。
今回、私はIoTデータを取得して、それをTimestreamに登録した後AMGで表示するという構成をとっていました。
図にするとこんな感じです。
データおよびグラフ表示の条件としては
- IoTデータは単純なJSON構造で数十バイト程度の大きさ
- IoTデータは1分に1回 Timestreamに登録される
- AMGでは直近10分のデータを1分毎にグラフ化
つまり1分に1回、直近10個のデータに対してクエリ実行します。
この時私は「数十バイト×10個のデータに対して1分に1回クエリするくらいなら大したTCUは消費しないだろ〜」という安直な考えで設定を行っていました。
翌日コストを確認した際にTimestreamに30USD近くのコストが発生していることに気づき、慌ててTimestreamのコストについて調べました。 ここでスキャンデータサイズに限らず、最低でも4TCUが30秒間消費されるということに気がつきました。 Timestreamの消費TCUグラフを確認したところ、確かに4TCUが消費され続けていました。 (画像の青色の部分)
AMGのような可視化サービスでは自動更新で画面を定期的に更新するケースも多いと思います。
更新はつまりデータベースへのクエリになるので、更新の度にコストが発生していることは留意しておくべきでしょう。
コスト
料金表を見た限りでは、どのくらいのスキャンサイズに対していくつTCUが消費されるかは分からないようです。
今回の場合は1回のクエリが最低単位の4TCU以下だったので、最低単位の4TCUが消費されていたようです。
クエリコストは東京リージョンで1TCUが0.648USD/1hours です。(執筆時点) これを最低単位の4TCU/30secondsにすると0.0216USDです。
つまり1分に1回 0.0216USDが発生するので、1日(24時間)実行し続けると31.104USDです。
まとめ
小さいデータに対するクエリでも一律でコストが発生するため、 可視化サービスでよくあるようなスキャンサイズが小さいが頻繁にクエリを実行する。というケースではデータソースにTimestreamである必要があるのか?ということを考えるべきだと思いました。
今回の場合ではデータソースをTimestreamからS3に変更して、AMGのデータソースにはAthenaを使うという手が考えられます。
Timestreamは時系列関数を使えるなど、便利な機能もたくさんあるので自身のユースケースに合わせて最適な選択をしましょう。